﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    public partial class Users : IGetLocalizedName, IGetNamesValues, IGetKeyValue
    {
        /// <summary>
        /// Полностью ли определён пользователь (указаны ли LoginName, NameRu, NameEn и Email)
        /// </summary>
        public bool IsFullDefined
        {
            get
            {
                if (!string.IsNullOrEmpty(UserFullNameEn) && !string.IsNullOrEmpty(UserFullNameRu) &&
                    !string.IsNullOrEmpty(UserLogin) && !string.IsNullOrEmpty(UserEmail))
                    return true;
                return false;
            }
        }

        /// <summary>
        /// Список ролей пользователя
        /// </summary>
        public List<Roles> Roles
        {
            get
            {
                // result = (from item in UsersInRoles select item.Roles) as List<Roles>;

                return UsersInRoles.Select(item => item.Roles).ToList();
            }
        }

        /// <summary>
        /// Получить полное имя пользователя локализованное
        /// </summary>
        /// <returns>Локализованное полное имя пользователя</returns>
        public string LocalizedFullName
        {
            get { return GetLocalizedName(); }
        }

        /// <summary>
        /// Является техником и незакрытые заявки
        /// </summary>
        public bool HasTechnicRequest
        {
            get
            {
                if(DB.Entities.TechnicRequests.Where(item=>item.IdTechnic==IdUser).Count()>0)
                    return true;
                
                
                return false;
            }
        }

        #region Implementation of IGetLocalizedName

        /// <summary>
        /// Получение имени на выбранном языке
        /// </summary>
        /// <param name="currentLanguage">Язык</param>
        /// <returns>Имя на заданном языке</returns>
        public string GetLocalizedName(CurrentLanguage currentLanguage)
        {
            switch (currentLanguage)
            {
                case CurrentLanguage.Russian:
                    return UserFullNameRu;
                case CurrentLanguage.English:
                    return UserFullNameEn;
                default:
                    throw new ArgumentOutOfRangeException("currentLanguage");
            }
        }

        /// <summary>
        /// Получение имени на текущем языке
        /// </summary>
        /// <returns>Локализованное имя</returns>
        public string GetLocalizedName()
        {
            CurrentLanguage lang = DB.CurrentLanguage;
            return GetLocalizedName(lang);
        }

        #endregion

        /// <summary>
        /// Обладает ли пользователь определённым типом роли
        /// </summary>
        /// <param name="idRoleType">Идентификатор типа роли</param>
        /// <returns>Результат</returns>
        public bool IsInRoleType(int idRoleType)
        {
            foreach (Roles role in Roles)
            {
                if (role != null && role.IdRolesType == idRoleType)
                    return true;
            }
            return false;
        }

        #region Implementation of IGetNamesValues

        /// <summary>
        /// Получение списка имён
        /// </summary>
        /// <returns>Список имён</returns>
        public List<string> GetNamesValues()
        {
            var Names = new List<string>();

            Names.Add(UserLogin.Replace(@"RU\\", ""));
            Names.Add(UserFullNameEn);
            Names.Add(UserFullNameRu);


            return Names;
        }

        #endregion

        #region Implementation of IGetKeyValue

        /// <summary>
        /// Получение ключего значения элемента
        /// </summary>
        /// <returns>Ключевое значение</returns>
        public int GetKeyValue()
        {
            return IdUser;
        }

        #endregion
    }
}